package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.DTO.property.PropertyAddVisitorDTO;
import com.itlong.cloud.POJO.PO.AppVisitorPassCodeRecordPO;
import com.itlong.cloud.POJO.VO.app.AppMineRoomInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyGetVisitorInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyVisitorInfoByPushVO;
import com.itlong.cloud.POJO.VO.property.PropertyVisitorInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyVisitorSendMessageVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      访客通行密码记录数据访问接口
 * </desc>
 *
 * @createDate
 */
@Mapper
@Repository
public interface IPropertyVisitorPassCodeRecordDao extends IAbstractBaseDao<AppVisitorPassCodeRecordPO>{
    /**
     * <desc>
     *      保存访客密码记录
     * </desc>
     *
     * @param params 数据参数
     * @return
     * @author Jiaqi.X
     * @createDate 2018/06/28
     */
    Integer save(Map<String, Object> params);


    /**
     * <desc>
     *      修改访客密码记录
     * </desc>
     *
     * @param params 数据参数
     * @return
     * @author Jiaqi.X
     * @createDate 2017/09/27
     */
    Integer update(Map<String,Object> params);

    /**
     * <desc>
     *      检查这个时间段内是否有重复的动态密码
     * </desc>
     *
     * @param random 随机动态密码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     * @author Jiaqi.X
     * @createDate 2018/06/28
     */
    int checkRepeatPassword(@Param("random") String random, @Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * <desc>
     *      获取楼栋下的云对讲机号集合
     * </desc>
     *
     * @param propertyAddVisitorDTO
     * @return
     * @author Jiaqi.X
     * @createDate 2018/06/28
     */
    Map<String,Object> getCloudIntercomUniquesByBuildIdAndUnitId(PropertyAddVisitorDTO propertyAddVisitorDTO);

    /**
     * <desc>
     *      获取楼栋下的门禁机号集合
     * </desc>
     *
     * @param propertyAddVisitorDTO
     * @return
     * @author Jiaqi.X
     * @createDate 2018/06/28
     */
    Map<String,Object> getEntranceUniquesByBuildIdAndUnitId(PropertyAddVisitorDTO propertyAddVisitorDTO);

    /**
     * <desc>
     *      获取楼栋下的电梯机号集合
     * </desc>
     *
     * @param propertyAddVisitorDTO
     * @return
     * @author Jiaqi.X
     * @createDate 2018/06/28
     */
    String getElevatorUniquesByBuildIdAndUnitId(PropertyAddVisitorDTO propertyAddVisitorDTO);

    /**
     * <desc>
     *      通过实际楼层找到电梯的楼层编码
     * </desc>
     *
     * @param floorNum
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2018/01/19
     */
    String getFloorAuthByFloorNumAndDeviceUnique(@Param("floorNum") String floorNum,@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      通过项目id获取项目秘钥
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2018/01/08
     */
    String getQrcodeProjectKey(@Param("projectId") String projectId);

    /**
     * <desc>
     *     访客列表数据
     * <desc/>
     *
     *@param  params  分页查询访客列表条件
     * @return  list 数据结果
     * @author JuGuang.S
     * @createDate 2018/06/28
     */
    List<PropertyVisitorInfoVO> getVisitorInfoByPage(Map<String, Object> params);

    /**
     * <desc>
     *     访客列表数据数量
     * <desc/>
     *
     *@param  params  分页查询访客条件
     * @return  Integer 数量
     * @author JuGuang.S
     * @createDate 2018/06/28
     */
    Integer getVisitorInfoCount(Map<String, Object> params);

    /**
     * <desc>
     *     获取当日访客数量
     * <desc/>
     *
     * @return  Integer 数量
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    Integer getVisitorDayCount(@Param("currentDay") String currentDay,@Param("projectId") String projectId);

    /**
     * <desc>
     *     根据访客ID获取访客信息
     * <desc/>
     *
     *@param  passId  访客ID
     * @return  PropertyGetVisitorInfoVO 访客信息VO
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    PropertyGetVisitorInfoVO getVisitorInfo(@Param("passId") String passId);

    /**
     * <desc>
     *     根据访客ID删除访客信息
     * <desc/>
     *
     *@param  visitorArr  访客ID多个以逗号分隔
     * @return
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    void deleteVisitorInfo(@Param("visitorArr") String[] visitorArr);

    /**
     * <desc>
     *     根据访客ID获取访客短信需要信息
     * <desc/>
     *
     *@param  passId
     * @return
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    PropertyVisitorSendMessageVO getVisitorMessage(@Param("passId") String passId);

    /**
     * <desc>
     *     根据访客ID更新发送短信的次数
     * <desc/>
     *
     *@param  passId  访客ID多个以逗号分隔
     * @return
     * @author JuGuang.S
     * @createDate 2018/07/02
     */
    void updateSendMssCount(@Param("passId") String passId);

    /**
     * <desc>
     *     查询APP添加访客未向物业推送消息的访客信息
     * <desc/>
     *
     *@param
     * @return
     * @author JuGuang.S
     * @createDate 2018/07/04
     */
    List<PropertyVisitorInfoByPushVO> getVisitorInfoByPush();

    /**
     * <desc>
     *     查询APP添加访客未向物业推送消息的访客信息
     * <desc/>
     *
     *@param
     * @return
     * @author JuGuang.S
     * @createDate 2018/07/04
     */
    void updatePushStatus(@Param("passId") String[] passId);

    /**
     * <desc>
     *     定时刷新访客表修改所有物业系统未在线时未推送消息的状态改为已推送，其定时刷新的时间须迟于VisitorPushMessageTimeTask.
     * <desc/>
     *
     *@param
     * @return
     * @author JuGuang.S
     * @createDate 2018/07/10
     */
    void updateNotPushMessageStatus();

    /**
     * <desc>
     *     根据roomid获取地址名称
     * <desc/>
     *
     * @return  Integer 数量
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    String getAdressByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *     根据unitid passid获取地址名称
     * <desc/>
     *
     * @return  Integer 数量
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    String getAdressByUnitId(@Param("passId") String passId,@Param("unitId") String unitId);

    /**
     * <desc>
     *     根据roomid passid获取地址名称
     * <desc/>
     *
     * @return  Integer 数量
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    String getAdressByRoomIdAndPassId(@Param("roomId") String roomId,@Param("passId") String passId);

    /**
     * <desc>
     *     根据unitid passid获取地址名称
     * <desc/>
     *
     * @return  Integer 数量
     * @author JuGuang.S
     * @createDate 2018/06/29
     */
    String getAdressByUnitIdAndProject(@Param("passId") String passId,@Param("unitId") String unitId);

    /**
     * <desc>
     *      获取项目动态密码验证方式
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2018/07/16
     */
    Integer getOtpOnlineByProjectId(@Param("projectId")String projectId);

    /**
     * <desc>
     *      获取项目秘钥
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2018/07/16
     */
    String getProjectKey(@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过单元id获取权限组号
     * </desc>
     * @param unitId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/08/23
     */
    String getGroupNumByUnitId(@Param("unitId") String unitId);

    /**
     * <desc>
     *      获取buildID
     * </desc>
     * @param projectId
     * @param buildNum
     * @param unitNum
     * @return
     * @author Juguang.S
     * @createDate 2018/11/24
     */
    Map<String,String> getBuildInfo(@Param("projectId") String projectId,@Param("buildNum") String buildNum,@Param("unitNum") String unitNum);

    /**
     * <desc>
     *      物业访客单审批
     * </desc>
     * @param passId 访客单ID
     * @param checkStatus 物业审核状态 1代表审批通过 2代表审批拒绝
     * @return
     * @author JuGuang.S
     * @createDate 2019/04/25
     */
    Integer propertyCheckVisitor(@Param("passId") String passId,@Param("checkStatus") Integer checkStatus,@Param("loginUserId") String loginUserId);

    /**
     * <desc>
     *      业主访客单审批
     * </desc>
     * @param passId 访客单ID
     * @param checkStatus 业主审核状态 1代表审批通过 2代表审批拒绝
     * @return
     * @author JuGuang.S
     * @createDate 2019/04/28
     */
    Integer OwnerCheckVisitor(@Param("passId") String passId,@Param("checkStatus") Integer checkStatus,@Param("loginUserId") String loginUserId);

    /**
     * <desc>
     *     根据房屋编号模糊查询房间
     * <desc/>
     *
     *@param  unitId  单元编号
     *@param  roomNum  房间编号
     * @return  MessageVO 标准格式化响应结果
     * @author Qiang.S
     * @createDate 2019/05/14
     */
    List<AppMineRoomInfoVO> getRoomInfoByNum(@Param("unitId") String unitId, @Param("roomNum") String roomNum);

    /**
     * <desc>
     *      获取没有设备地址的电梯设备
     * </desc>
     *
     * @param elevators 电梯机号数组
     * @return
     * @author Jiaqi.X
     * @createDate 2018/01/31
     */
    List<String> getNotHaveAddressElevators(@Param("elevators")String[] elevators);

    /**
     * <desc>
     *      获取项目访客配置
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2020/05/22
     */
    Map<String, Object> getVisitorConfigure(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取当前楼栋号的电梯设备序列号集合
     * </desc>
     *
     * @param buildId 楼id
     * @param unitId 栋id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/14
     */
    List<String> getFloorUniqueByBuildIdAndUnitId(@Param("buildId") String buildId,@Param("unitId") String unitId);

    /**
     * <desc>
     *      根据房间id获取房间编号
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/05/14
     */
    String getRoomNumByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      根据passid获取当前项目的审批配置信息
     * </desc>
     *
     * @param passId
     * @return
     * @author Juguang.S
     * @createDate 2019/05/21
     */
    Map<String,Object> getProjectInfoByPassId(@Param("passId") String passId);

    /**
     * <desc>
     *      根据roomId获取房间的正背门信息
     * </desc>
     *
     * @param roomId
     * @return
     * @author Juguang.S
     * @createDate 2019/06/26
     */
    String getRoomForDoorInfo(@Param("roomId") String roomId);

    /**
     * <desc>
     *      根据deviceId获取电梯的正背门信息
     * </desc>
     *
     * @param deviceId 机号
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019/06/26
     */
    String getElevatorDoorInfo(@Param("deviceId") String deviceId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过sn获取楼栋id
     * </desc>
     *
     * @param sn
     * @return
     * @author Juguang.S
     * @createDate 2019/09/22
     */
    Map<String,Object> getBuildAndUnitBySn(@Param("sn") String sn);

    /**
     * <desc>
     *      根据passId获取访客具体数据
     * </desc>
     *
     * @param passId 访客单ID
     * @return
     * @author Juguang.S
     * @createDate 2020/01/13
     */
    AppVisitorPassCodeRecordPO getVisitorByRenewVisitor(@Param("passId") String passId);

    /**
     * <desc>
     *      通过设备唯一编码查询公共楼层所对应的权限标识
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Juguang.S
     * @createDate 2020/08/07
     */
    String getCommonFloorAuthByDeviceUnique(@Param("floorNum") String[] floorNum,@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      通过设备唯一编码查询公共楼层
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Juguang.S
     * @createDate 2020/08/07
     */
    String getCommonFloorByDeviceUnique(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取访客时间限制信息
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/09/15
     */
    Map<String,Object> getVisitorTimeInfo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      保存访客人脸信息
     * </desc>
     *
     * @param passId 访客信息编号
     * @param uploadFilePath 图片地址
     * @param vFaceId 百度中的人脸编号
     * @return sql执行行数
     * @author Qiang.S
     * @createDate 2019/02/27
     */
    Integer setVisitPassFace(@Param("passId") String passId, @Param("uploadFilePath")String uploadFilePath, @Param("vFaceId")String vFaceId);

}
